Hi,
call the onchange product with good order pricelist, fiscal position, date order, partner_id order .... and you will have all good values like if you will do this manually in the view.
UPDATE : code written without testing
1) just do operation in create sale.order :
def create(self, cr, uid, vals, context=None):
    context = context or {}
    sol = self.pool.get('sale.order.line') 
    if vals.get('name','/')=='/':
    vals['name'] = self.pool.get('ir.sequence').get(cr, uid, 'sale.order') or '/'
    pricelist_id = vals.get('pricelist_id') or False
    fiscal_position_id = vals.get('fiscal_position') or False
    partner_id = vals.get('partner_id') or False
    date_order = vals.get('date_order') or False
    order_line = False
   # In onchange, I put quantity = 1 because not specified, important to calculate correctly pricelist sometimes give different price_unit depending of quantity ... (specify you real quantity by product). You can loop directly on onchange I think ...
    for product_id, qty in [(1, 1), (4, 1)]:
        onchange = sol.product_id_change(cr, uid, [], pricelist_id, product_id, qty=qty, uom=False, qty_uos=qty, uos=False, name='', partner_id=partner_id, lang=False, update_tax=True, date_order=date_order, packaging=False, fiscal_position=fiscal_position_id , flag=False, context=context)
        onchange = onchange.get('value') or False
        if onchange:
            tax_id = onchange.get('tax_id') or []
            if tax_id:
                tax_id = [[6, 0, tax_id]]
            onchange['tax_id'] = tax_id
            onchange['product_id'] = product_id
            onchange['qty'] = qty 
            order_line += [(0, 0, onchange)]
 
 
    if order_line:
        vals['order_line'] += order_line
    res = super(sale_order, self).create(cr, uid, vals, context=context) 
2) to get tax (see in sol function product_id_change):
        context = context or {}
        lang = lang or context.get('lang', False)
        if not partner_id:
                raise osv.except_osv(_('No Customer Defined!'), _('Before choosing a product,\n select a customer in the sales form.'))
        partner_obj = self.pool.get('res.partner')
        product_obj = self.pool.get('product.product')
        context = {'lang': lang, 'partner_id': partner_id}
        partner = partner_obj.browse(cr, uid, partner_id)
        lang = partner.lang
 context_partner = {'lang': lang, 'partner_id': partner_id}
        fpos = False
        if not fiscal_position:
                fpos = partner.property_account_position or False
        else:
                fpos = self.pool.get('account.fiscal.position').browse(cr, uid, fiscal_position)
        if update_tax: #The quantity only have changed
                result['tax_id'] = self.pool.get('account.fiscal.position').map_tax(cr, uid, fpos, product_obj.taxes_id)
 
Bye